import json
import time
import random


def iPN_StringEnc(keystr, src, maxsize):
    # 定义一个长度为17的列表Key，用于存储密钥
    Key = [0] * 17

    # 将密钥字符串的前16个字符复制到Key列表中
    for i in range(16):
        if i < len(keystr):
            Key[i] = ord(keystr[i])
        else:
            break

    # 检查目标缓冲区大小是否足够
    if maxsize < len(src) * 2 + 3:
        return -1, None

    # 初始化目标缓冲区为一个空字符串
    dest = [''] * maxsize

    # 使用当前时间作为随机数生成器的种子
    random.seed(int(time.time()))

    # 生成一个随机数s，并确保其在0到255之间
    s = abs(random.randint(0, 255))

    # 初始化目标缓冲区
    dest[0] = chr(ord('A') + ((s & 0xF0) >> 4))
    dest[1] = chr(ord('a') + (s & 0x0F))

    # 遍历源字符串
    for i in range(len(src)):
        # 计算加密值v
        v = s ^ Key[(i + s * (s % 23)) % 16] ^ ord(src[i])

        # 将加密后的值存储在目标缓冲区中
        dest[2 * i + 2] = chr(ord('A') + ((v & 0xF0) >> 4))
        dest[2 * i + 3] = chr(ord('a') + (v & 0x0F))

        # 更新s值为当前的v值
        s = v

    # 将目标缓冲区转换为字符串
    encoded_string = ''.join(dest).rstrip('\0')

    # 如果所有操作成功，返回0和编码后的字符串
    print(encoded_string)
    return 0, encoded_string


def iPN_StringDec(keystr, encoded_string):
    # 定义一个长度为17的列表Key，用于存储密钥
    Key = [0] * 17

    # 将密钥字符串的前16个字符复制到Key列表中
    for i in range(16):
        if i < len(keystr):
            Key[i] = ord(keystr[i])
        else:
            break

    # 检查编码后的字符串长度是否有效
    if len(encoded_string) < 2 or (len(encoded_string) - 2) % 2 != 0:
        return -1, None

    # 初始化源字符串缓冲区
    src = [''] * ((len(encoded_string) - 2) // 2)

    # 从编码后的字符串中提取初始的s值
    s = (ord(encoded_string[0]) - ord('A')) * 16 + (ord(encoded_string[1]) - ord('a'))

    # 遍历编码后的字符串
    for i in range(len(src)):
        # 从编码后的字符串中提取加密值v
        v = (ord(encoded_string[2 * i + 2]) - ord('A')) * 16 + (ord(encoded_string[2 * i + 3]) - ord('a'))

        # 计算原始字符
        original_char = chr(s ^ Key[(i + s * (s % 23)) % 16] ^ v)

        # 将解密后的字符存储在源字符串缓冲区中
        src[i] = original_char

        # 更新s值为当前的v值
        s = v

    # 将源字符串缓冲区转换为字符串
    decoded_string = ''.join(src)

    # 如果所有操作成功，返回0和解码后的字符串
    return 0, decoded_string


if __name__ == "__main__":
    # 示例调用
    start_time = time.time()
    keystr = "RSBOTDWakeupKey@"
    mode = input("加密0，解密1：")
    if mode == "0":
        while True:
            did = input("请输入did：")
            ip = input("请输入ip：")
            message = {"DID": did, "IP": ip}
            src = json.dumps(message)
            maxsize = 256  # 请根据实际情况设置最大缓冲区大小
            result, encoded_string = iPN_StringEnc(keystr, src, maxsize)
            if result == 0:
                print(f"Encoded string: {encoded_string}")
            else:
                print("Encoding failed.")
    else:
        while True:
            encoded_string = input("请输入需解密字符串：")
            result, encoded_string = iPN_StringDec(keystr, encoded_string)
            end_time = time.time()
            print(encoded_string)
            print(end_time - start_time)
